#!/bin/bash -e
#
# ethtool-import-uapi [commit]
#
# Imports sanitized copies of kernel uapi headers from <commit> (can be
# a commit id, a tag or a branch name). If the argument is omitted,
# commit currently checked out in the kernel repository is used.

sn="${0##*/}"
export ARCH="x86_64"
mkopt="-j$(nproc)" || mkopt=''

if [ ! -d "$LINUX_GIT" ]; then
    echo "${sn}: please set LINUX_GIT to the location of kernel git" >&2
    exit 1
fi

pushd "$LINUX_GIT"
if [ -n "$1" ]; then
    git checkout "$1"
fi
desc=$(git describe --exact-match 2>/dev/null \
       || git show -s --abbrev=12 --pretty='commit %h')
kobj=$(mktemp -d)
make $mkopt O="$kobj" allmodconfig
make $mkopt O="$kobj" prepare
make $mkopt O="$kobj" INSTALL_HDR_PATH="${kobj}/hdr" headers_install
popd

pushd uapi
find . -type f -name '*.h' -exec cp -v "${kobj}/hdr/include/{}" {} \;

go_on=true
while $go_on; do
    go_on=false
    while read f; do
        if [ "${f#asm/}" != "$f" ]; then
            # skip architecture dependent asm/ headers
            continue
        fi
        if [ -f "$f" ]; then
            # already present
            continue
        fi
	if [ ! -f "${kobj}/hdr/include/${f}" ]; then
            # not a kernel header
            continue
        fi
        echo "+ add $f"
        go_on=true
        mkdir -p "${f%/*}"
        cp "${kobj}/hdr/include/${f}" "${f}"
    done < <(
        find . -type f -name '*.[ch]' -exec sed -nre '\_^[[:blank:]]*#include[[:blank:]]<.+>_ { s_^[[:blank:]]*#include[[:blank:]]<([^>]*)>.*$_\1_ ; p }' {} \; \
            | LC_ALL=C sort -u
    )
done
popd
rm -rf "$kobj"

git add uapi
git commit -s -F - <<EOT
update UAPI header copies

Update to kernel ${desc}.

EOT
